package org.apache.lucene.analysis.kr;

import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.kr.ma.Dictionary;
import org.apache.lucene.analysis.kr.ma.MExpression;
import org.apache.lucene.analysis.kr.ma.MorphemeAnalyzer;


import java.io.Reader;
import java.io.StringWriter;
import java.io.IOException;
import java.util.List;

public class KoreanTokenizer extends Tokenizer {
	
    /** word type: single=>ASCII  double=>non-ASCII word=>default */
    private String tokenType = "word";

    /** buffer size: */
    private static final int IO_BUFFER_SIZE = 256;

    /** 주어진 문자열에서의 토큰 갯수  */
    private int tokenNum = 0;
    
    /** 현재 토큰의 인덱스 번호 */
    private int tokenIndex = 0;
    
    /**  문자열을 분석하여 생성한  토큰 리스트 */
    private List tokenList;
    
    /** 주어진 문자열의 분석 완료 유무 플래그 **/
    private boolean tokenEnd = false;

    private boolean readingFlag = true;
    
    

    /**
     * character buffer, store the characters which are used to compose <br>
     * the returned Token
     */
    private final char[] ioBuffer = new char[IO_BUFFER_SIZE];
    
	private StringWriter output = null;
	private MorphemeAnalyzer krMorphe = null;
	
	public KoreanTokenizer (Reader in, Dictionary dic) {
        input = in;
        output = new StringWriter();
        krMorphe = new MorphemeAnalyzer(dic);
	}

    public final Token next() throws IOException {
		// 1. 한글 형태소 분석기에 reader 문자 스트림을 넘긴다.
		// 2. 리턴값으로 토큰화된 리스트를 받는다
    	// 3. 리스트의 각 인덱스를 start, end 로 처리하여 토큰화 한다. 알고리즘 고안할 것
    	String contents;
    	
        if (readingFlag == true) {
            input.read(ioBuffer);
    		// 한글 형태소 분석기에 넘기기 위해 다시 String 형태로 변환함.
    		output.write(ioBuffer);
    		contents = output.toString();
    		System.out.print("Contents : " + contents);
    		
    		// 주어진 문자열을 분석한다.
        	try {
    			tokenList = krMorphe.analyze(contents);
    			// 분석된 총 토큰수를 저장.
    			tokenNum = tokenList.size();
    			System.out.println("tokenNum = " + tokenNum);
        	} catch (Exception e) {
    			e.printStackTrace();
    			System.exit(0);
    		}
        }
        
        // 모든 토큰을 분석했으면 종료하며, 다음 스트림을 읽는다.
        if (tokenNum == 0) {
        	readingFlag = true;
        	// TO-DO : ioBuffer 초기화를 해야함 
        	return null;
        }

		String retToken, tokenCandidate, token;
		String[] tmpArr;
		retToken = ((MExpression)tokenList.get(tokenIndex)).toHighString(); // hadoop:{HADOOP/NR}
		tmpArr = retToken.split(":"); // (hadoop, {HADOOP/NR})
		tokenCandidate = tmpArr[1].substring(1, tmpArr[1].length() - 1); // HADOOP/NR
		tmpArr = tokenCandidate.split("/"); // (HADOOP, NR)
		
		/*
		if (tmpArr[0].trim() == null) {
			// 토큰 인덱스는 증가시키고 토큰 갯수는 감소 
			tokenIndex++;
			tokenNum--;
			return null;
		}*/
		
		tokenCandidate = tmpArr[0]; // HADOOP
		System.out.println("Token : " + tokenCandidate);
		Token result = new Token(tokenCandidate, 0, tokenCandidate.length(), tokenType);

		tokenIndex++;
		tokenNum--;
        return result;
    }
}
